package com.android.job.util;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Vector;

import android.util.Log;

/******************************************************************
 * 文件名称	: LogX.java
 * 作    者	: sheng.fang
 * 创建时间	: 2010-12-8 上午09:49:26
 * 文件描述	: 日志开关类
 * 修改历史	: 2010-12-8 1.00 初始版本
 ******************************************************************/
public class LogX extends Thread
{
	/**
	 * 保存路径
	 */
	public static String LOG_PATH = "/sdcard/dbank/Log/";
	/**
	 * 日志名
	 */
	private static final String TAG = "== LogTrace ==";

	/**
	 * 写入的文件名
	 */
	private final static String FILENAME = "log.txt";

	/**
	 * 日志最大条数，超过该条数时，增加日志会先删除队首日志
	 */
	private static int MAXLOGSIZE = 100;

	/**
	 * 日志容器
	 */
	public static Vector<String> LOGS = new Vector<String>();

	/**
	 * 写文件任务的列表
	 */
	private static Queue<String> lstStorageTask;

	/**
	 * 写文件线程是否正在运行
	 */
	private static boolean isRunnig;

	/**
	 * 需要随机写入的文件流对象
	 */
	private static RandomAccessFile file = null;

	
	/**
	 * 构造函数  
	 */
	public LogX(String path)
	{
		LOG_PATH = path;
		lstStorageTask = new LinkedList<String>();
		isRunnig = true;
		
	}

	/**
	 * 构造文件对象    
	 * @throws SDNotEnouchSpaceException 
	 */

	
	/**
	 * 向存储线程中添加写文件任务
	 * @param log    日志信息
	 */
	public static void trace(String tag, String message)
	{
		Log.i(tag, message);
		if (message == null)
		{
			message = "java.lang.NullPointerException.";
		}
		if (isRunnig )
		{
			synchronized (lstStorageTask)
			{
				if (LOGS.size() >= MAXLOGSIZE)
				{
					LOGS.removeAllElements();
					deleteFile();
					closeFile();
		//			openFile();
				}
				LOGS.addElement(message);

				lstStorageTask.add(tag + " >>>>>>>>> " + message+"\n");
				lstStorageTask.notify();
			}
		}
	}



	/**
	 * 向SD卡中存储文件时出错处理
	 */
	private static void writeLogError()
	{
		// 置位写文件线程运行标志
		isRunnig = false;

		// 关闭文件流
		closeFile();

		// 清空写文件任务
		clearLogTaskList();
	}

	/**
	 * 关闭文件对象 
	 */
	public static void closeFile()
	{
		try
		{
			if (file != null)
			{
				file.close();
			}
		}
		catch (IOException e)
		{
			Log.i(TAG, "file.close() Exception!!!");
		}
		finally
		{
			file = null;
		}
	}

	/**
	 *  清空写文件任务
	 */
	private static void clearLogTaskList()
	{
		synchronized (lstStorageTask)
		{
			// 先清空所有的任务对象
			Iterator<String> tasks = lstStorageTask.iterator();
			while (tasks.hasNext())
			{
				String task = tasks.next();
				if (task != null)
				{
					// 清空内存
					task = null;
				}
			}
			// 清空任务列表
			lstStorageTask.clear();
		}
	}

	/**
	 * 删除文件    
	 */
	public static void deleteFile()
	{
		File file = new File(LOG_PATH + FILENAME);
		if (file.exists())
		{
			try
			{
				if (file.delete())
				{
					Log.i("LogX", "Delete log file success");
				}
				else
				{
					Log.e("LogX", "Delete log file failed");
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}